package cn.alpaca.cloud.common.json;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.util.List;
import java.util.TimeZone;

@Slf4j
public class JsonUtils {

    public static ObjectMapper defaultNonNull;

    static {
        defaultNonNull = new ObjectMapper();
        defaultNonNull.setSerializationInclusion(JsonInclude.Include.NON_EMPTY).setSerializationInclusion(JsonInclude.Include.NON_NULL);
        defaultNonNull.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        defaultNonNull.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        defaultNonNull.setDateFormat(DateFormat.getDateTimeInstance());
    }

    /**
     * 将 JSON 字符串转换为指定类型的对象。
     *
     * @param json    JSON 字符串
     * @param tClass  目标对象的类类型
     * @param <T>     目标对象的泛型类型
     * @return 转换后的对象，如果转换失败则返回 null
     */
    public static <T> T fromJson(String json, Class<T> tClass) {
        try {
            return defaultNonNull.readValue(json, tClass);
        } catch (JsonProcessingException e) {
            log.error("json转换异常:{}", json, e);
        }
        return null;
    }

    /**
     * 将对象转换为 JSON 字符串。
     *
     * @param obj 要转换的对象
     * @param <T> 对象的泛型类型
     * @return 转换后的 JSON 字符串，如果转换失败则返回 null
     */
    public static <T> String toJson(T obj) {
        try {
            return defaultNonNull.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.error("json转换异常:{}", obj, e);
        }
        return null;
    }

    /**
     * 将 JSON 字符串转换为指定类型的对象列表。
     *
     * @param jsonStr JSON 字符串
     * @param tClass  列表中对象的类类型
     * @param <T>     列表中对象的泛型类型
     * @return 转换后的对象列表，如果转换失败则返回 null
     */
    public static <T> List<T> fromJsonList(String jsonStr, Class<T> tClass) {
        try {
            CollectionType collectionType = defaultNonNull.getTypeFactory().constructCollectionType(List.class, tClass);
            return defaultNonNull.readValue(jsonStr, collectionType);
        } catch (JsonProcessingException e) {
            log.error("从json字符转换数组异常:{}", jsonStr, e);
        }
        return null;
    }

    /**
     * 将 JSON 字符串转换为指定 JavaType 类型的对象。
     *
     * @param json      JSON 字符串
     * @param javaType  目标对象的 JavaType 类型
     * @param <T>       目标对象的泛型类型
     * @return 转换后的对象，如果转换失败则返回 null
     */
    public static <T> T fromJson(String json, JavaType javaType) {
        try {
            return defaultNonNull.readValue(json, javaType);
        } catch (JsonProcessingException e) {
            log.error("json转换异常:{}", json, e);
        }
        return null;
    }
}
